package chapters22.class2;

import java.lang.reflect.Field;

/**
 * Created by xinxuchu on 2020/8/18.
 */
public class SimpleContainer {


    /**
     * 代码假定每个类型都有一个public默认构造方法，使用它创建对象，然后查看每个字段，
     * 如果有SimpleInject注解，就根据字段类型获取该类型的实例，并设置字段的值。
     * @param cls
     * @param <T>
     * @return
     */
    public static <T> T getInstance(Class<T> cls){
        try {
            T object = cls.newInstance();
            Field[] fields = cls.getFields();
            for (Field f:fields) {
                if (f.isAnnotationPresent(SimpleInject.class)){
                    if (!f.isAccessible()){
                        f.setAccessible(true);
                    }
                    Class<?> fieldCls = f.getType();
                    f.set(object,getInstance(fieldCls));
                }
            }
            return object;
        }catch (Exception e){
            throw new RuntimeException(e);
        }
    }
}
